package unidades;

import mapa.Coordenada;

/**
 * Clase abstracta que es la superclase de cualquier unidad con la
 * que se pueda jugar
 *
 * @author Ibai
 */
public abstract class Unidad {

    private Coordenada posicion;

    /**
     * Constructor vacío que crea una nueva unidad
     */
    public Unidad() {
        //this(0, 0);
        posicion = null;
    }

    /**
     * Constructor que recibe la posición para crear una unidad
     *
     * @param x Posición en la coordenada x
     * @param y Posición en la coordenada y
     */
    public Unidad(int x, int y) {
        posicion = new Coordenada(x, y);
    }

    /**
     * Devuelve la posicion de esta unidad
     * 
     * @return La coordenada de esta unidad
     */
    public Coordenada getPosicion() {
        return posicion;
    }

    /**
     * Establece la posicion de esta unidad
     * 
     * @param posicion La nueva posicion para la unidad. No puede ser null ni menor que (0, 0)
     */
    public void setPosicion(Coordenada posicion) {
        if (posicion == null) {
            throw new NullPointerException("La posición es null");
        }
        if (posicion.getX() < 0 || posicion.getY() < 0) {
            throw new IllegalArgumentException("Las coordenadas no pueden ser negativas (x, y) = (" + posicion.getX() + ", " + posicion.getY() + ")");
        }
        this.posicion = posicion;
    }

    /**
     * Bloquea la unidad actual para que no pueda realizar acciones
     */
    public abstract void bloquear();

    /**
     * Reinicia el estado de la unidad
     */
    public abstract void resetState();

    /**
     * {@inheritDoc}
     */
    @Override
    public String toString() {
        return this.getClass().getSimpleName();
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (!(obj instanceof Unidad)) {
            return false;
        }
        Unidad other = (Unidad) obj;
        if (!posicion.equals(other.posicion)) {
            return false;
        }
        return true;
    }
}
